package modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Ejb de entidad que representa a la tabla 'producto' en la BD.
 * 
 * @author Boris Maclean.
 */
@Entity
@Table(name = "producto")
public class Producto implements Serializable {

    /**
     * atributo correlativo implementado por la serializacion.
     */
    private static final long serialVersionUID = 1L;
    /**
     * El atributo idDetalle mapea la primary key de la tabla 'producto'.
     */
    @Id
    @Column(name = "COD_PRODUCTO")
    private String codProducto;
    /**
     * atributo que referencia el nombre de la tabla producto.
     */
    @Column(name = "NOMBRE")
    private String nombre;
    /**
     * atributo que referencia al detalle de la tabla producto.
     */
    @Column(name = "DESCRIPCION")
    private String descripcion;
    /**
     * atributo que referencia al precio de la tabla producto.
     */
    @Column(name = "PRECIO")
    private int precio;
    /**
     * atributo que referencia a la cantidad(stock) de la tabla producto.
     */
    @Column(name = "CANTIDAD")
    private int cantidad;

    /**
     * El atributo detalle es un arreglo de tipo 'DetalleCarro' que mapea la
     * relacion uno a muchos (el producto puede tener varios detalles).
     */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "elProducto")
    private List<DetalleCarro> detalle = new ArrayList<DetalleCarro>();

    /**
     * constructor por defecto.
     * 
     */
    public Producto() {
    }

    /**
     * Producto constructor con los siguientes parametros.
     * 
     * @param codProducto
     * @param nombre
     * @param descripcion
     * @param precio
     * @param cantidad
     * @param detalle
     */
    public Producto(String codProducto, String nombre, String descripcion,
            int precio, int cantidad, List<DetalleCarro> detalle) {
        this.codProducto = codProducto;
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.precio = precio;
        this.cantidad = cantidad;
        this.detalle = detalle;
    }

    /**
     * Permite capturar el atributo codProducto.
     * 
     * @return el valor codProducto.
     */
    public String getCodProducto() {
        return codProducto;
    }

    /**
     * Permite asignar un valor al atributo codProducto.
     * 
     * @param codProducto
     *            es el nuevo valor para codProducto.
     */
    public void setCodProducto(String codProducto) {
        this.codProducto = codProducto;
    }

    /**
     * Permite capturar el atributo nombre.
     * 
     * @return el valor nombre.
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Permite asignar un valor al atributo nombre.
     * 
     * @param nombre
     *            es el nuevo valor para nombre.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Permite capturar el atributo descripcion.
     * 
     * @return el valor descripcion.
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * Permite asignar un valor al atributo descripcion.
     * 
     * @param descripcion
     *            es el nuevo valor para descripcion.
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * Permite capturar el atributo precio.
     * 
     * @return el valor precio.
     */
    public int getPrecio() {
        return precio;
    }

    /**
     * Permite asignar un valor al atributo precio.
     * 
     * @param precio
     *            es el nuevo valor para precio.
     */
    public void setPrecio(int precio) {
        this.precio = precio;
    }

    /**
     * Permite capturar el atributo cantidad.
     * 
     * @return el valor cantidad.
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * Permite asignar un valor al atributo cantidad.
     * 
     * @param cantidad
     *            es el nuevo valor para cantidad.
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * Permite capturar el atributo detalle.
     * 
     * @return el valor detalle.
     */
    public List<DetalleCarro> getDetalle() {
        return detalle;
    }

    /**
     * Permite asignar un valor al atributo detalle.
     * 
     * @param detalle
     *            es el nuevo valor para detalle.
     */
    public void setDetalle(List<DetalleCarro> detalle) {
        this.detalle = detalle;
    }

}
